вернуться в раздел "Научные труды"

seaborn: статистическая визуализация данных

Майкл Л. Васком1

Программное обеспечение

Редактор: Лорена Пантано G

Рецензенты:
- @dangles
- @Sara-Shiho

Подана: 29 января 2021 г.
Опубликована: 6 апреля 2021 г.

Лицензия

Авторы статей сохраняют за собой авторские права и публикуют работу под международной лицензией Creative Commons Attribution 4.0 (CC BY 4.0).

1 Центр нейронных наук, Нью-Йоркский университет

Аннотация

seaborn — это библиотека для построения статистических графиков на Python. Она предоставляет высокоуровневый интерфейс к matplotlib и тесно интегрируется со структурами данных pandas. Функции библиотеки seaborn предоставляют декларативный API, ориентированный на наборы данных, что позволяет легко переводить вопросы о данных в графики, способные на них ответить. Получив набор данных и спецификацию графика для построения, seaborn автоматически сопоставляет значения данных с визуальными атрибутами, такими как цвет, размер или стиль, внутренне вычисляет статистические преобразования и оформляет график информативными подписями к осям и легендой. Многие функции seaborn могут генерировать рисунки с несколькими панелями, которые облегчают сравнения между условными подмножествами данных или между различными парами переменных в наборе данных. seaborn спроектирован так, чтобы быть полезным на протяжении всего жизненного цикла научного проекта. Создавая законченные графики с помощью единственного вызова функции с минимальными аргументами, seaborn способствует быстрому прототипированию и разведочному анализу данных. А благодаря наличию обширных возможностей для настройки, а также доступу к базовым объектам matplotlib, его можно использовать для создания отточенных, готовых к публикации иллюстраций.

Обоснование необходимости

Визуализация данных — неотъемлемая часть научного процесса. Эффективные визуализации позволяют учёному как понять свои собственные данные, так и донести свои идеи до других (Tukey, 1977). Этим целям могут способствовать инструменты для построения графиков, обеспечивающие хороший баланс между эффективностью и гибкостью. В экосистеме научного Python проект matplotlib (Hunter, 2007) является очень хорошо устоявшимся, находясь в непрерывной разработке почти два десятилетия. Он чрезвычайно гибок, предлагая детальный контроль над расположением и визуальным видом объектов на графике. Его можно использовать интерактивно через GUI-приложения, и он может выводить графику в широкий спектр статических форматов. Тем не менее, его относительно низкоуровневый API может сделать выполнение некоторых распространённых задач обременительным. Например, создание точечной диаграммы, где размер маркера представляет числовую переменную, а форма маркера — категориальную переменную, требует преобразования значений размера в графические единицы и цикла по уровням категорий с отдельным вызовом функции построения для каждого типа маркера.

Библиотека seaborn предлагает интерфейс к matplotlib, позволяющий быстро исследовать данные и создавать прототипы визуализаций, сохраняя при этом большую часть гибкости и стабильности, необходимых для создания графиков публикационного качества. Она является предметно-независимой (доменно-общей) и может использоваться для визуализации широкого спектра наборов данных, хорошо представленных в табличном формате.

Пример

Следующий пример демонстрирует создание рисунка с помощью seaborn. В примере используется один из встроенных наборов данных, предоставляемых для документирования и генерации воспроизводимых отчётов об ошибках. Он иллюстрирует несколько функций, описанных в разделе «Обзор», включая декларативный API, семантические сопоставления, разбиение на подграфики (фасетирование), агрегацию с полосами погрешностей и управление визуальной темой.

import seaborn as sns
sns.set_theme(context="paper")
fmri = sns.load_dataset("fmri")
g = sns.relplot(
    data=fmri, kind="line",
    x="timepoint", y="signal",
    hue="event", style="event", col="region",
    height=3.5, aspect=.8,
)
g.savefig("paper_demo.pdf")
Пример рисунка seaborn, демонстрирующий некоторые из его ключевых особенностей. Изображение сгенерировано с использованием seaborn v0.11.1.
Рисунок 1 — Пример рисунка seaborn, демонстрирующий некоторые из его ключевых особенностей. Изображение сгенерировано с использованием seaborn v0.11.1.

Обзор

Пользователи взаимодействуют с seaborn через набор функций построения графиков, которые используют общий API для спецификации графика и предлагают множество более специфичных опций для настройки. Эти функции варьируются от базовых типов графиков, таких как точечные и линейные диаграммы, до функций, применяющих различные преобразования и абстракции, такие как бинирование гистограмм, оценку ядерной плотности и подгонку регрессионных моделей. Функции в seaborn классифицируются как «функции уровня осей» (axes-level) или «функции уровня рисунка» (figure-level). Функции уровня осей ведут себя подобно большинству функций построения в пространстве имён matplotlib.pyplot. По умолчанию они подключаются к машине состояний, отслеживающей «текущий» рисунок, и добавляют к нему слой, но они также могут принимать объект осей matplotlib, чтобы контролировать, где рисуется график, аналогично использованию «объектно-ориентированного» интерфейса matplotlib. Функции уровня рисунка создают собственный рисунок при вызове, что позволяет им «фасетировать» набор данных, создавая несколько условных подграфиков, а также добавлять удобства, такие как размещение легенды вне пространства графика по умолчанию. Каждая функция уровня рисунка соответствует нескольким функциям уровня осей, служащим сходным целям, с единственным параметром, выбирающим

вид графика для построения. Например, функция displot может создавать несколько различных представлений распределения, включая гистограмму, оценку ядерной плотности или эмпирическую функцию кумулятивного распределения. Функции уровня рисунка используют класс seaborn, который управляет компоновкой рисунка, выступая посредником между функциями уровня осей и matplotlib. Эти классы являются частью публичного API и могут использоваться напрямую для продвинутых приложений.

Одной из ключевых особенностей seaborn является то, что переменные в наборе данных могут автоматически «сопоставляться» с визуальными атрибутами графика. Эти преобразования называются «семантическими» сопоставлениями, потому что они наделяют атрибуты смыслом относительно набора данных. Освобождая пользователя от необходимости вручную задавать преобразования — что зачастую требует написания циклов и множественных вызовов функций при прямом использовании matplotlib — seaborn позволяет быстро исследовать многомерные взаимосвязи. Для дальнейшего повышения эффективности параметры сопоставлений по умолчанию являются «продуманными» (opinionated). Например, при сопоставлении цвета элементов графика seaborn определяет, использовать ли качественное или количественное сопоставление, основываясь на том, являются ли входные данные категориальными или числовыми. Это поведение можно дополнительно настроить или даже переопределить, устанавливая дополнительные параметры каждой функции построения.

Некоторые функции seaborn также применяют статистические преобразования к входным данным перед построением графика, от оценки среднего или медианы до подгонки общей линейной модели. Когда данные преобразуются таким образом, seaborn автоматически вычисляет и отображает полосы погрешностей, чтобы дать визуальную подсказку о неопределённости оценки. В отличие от многих графических библиотек, seaborn по умолчанию показывает полосы погрешностей для 95% доверительного интервала, а не стандартные ошибки. Доверительные интервалы вычисляются с помощью алгоритма бутстрэпа, что позволяет обобщать их для многих различных статистик, а уровень по умолчанию позволяет пользователю проводить «визуальный вывод» (Cumming & Finch, 2005). Исторически спецификация полос погрешностей была относительно ограниченной, но в предстоящем релизе (v0.12) появится новая система конфигурации, которая позволит отображать непараметрические процентильные интервалы и масштабированные аналитические оценки стандартной ошибки или статистик стандартного отклонения.

seaborn стремится быть гибким в отношении формата входных данных. Наиболее удобный шаблон использования предоставляет фрейм данных pandas (McKinney, 2010) с переменными, закодированными в длинном или «аккуратном» (tidy) формате (Wickham, 2014). В этом формате столбцы фрейма данных могут быть явно назначены на роли в графике, например, указание позиций x и y для точечной диаграммы вместе с семантикой размера и формы. Данные в длинном формате поддерживают эффективное исследование и прототипирование, потому что переменным можно назначать разные роли на графике без изменения исходного набора данных. Но большинство функций seaborn также могут принимать и визуализировать данные в «широком» формате, обычно производя вывод, аналогичный тому, как аналогичная функция matplotlib интерпретировала бы двумерный массив (например, создавая boxplot, где каждый ящик представляет столбец в фрейме данных), используя при этом имена индекса и столбцов для подписей графика. Использование информации о метках в объекте pandas помогает создавать интерпретируемые графики без дополнительной доработки — снижая вероятность ошибок интерпретации — но seaborn также принимает данные из различных более простых форматов, включая массивы numpy (Harris et al., 2020) и простые типы коллекций Python.

seaborn также предлагает несколько встроенных тем, которые пользователи могут выбирать для изменения визуального вида своих графиков. Темы используют систему rcParams matplotlib, что означает, что они будут действовать для любого рисунка, созданного с помощью matplotlib, а не только для тех, что созданы seaborn. Темы определяются двумя непересекающимися наборами параметров, которые отдельно контролируют стиль рисунка и масштабирование его элементов (таких как толщина линий и размеры шрифтов). Это разделение позволяет легко генерировать несколько версий рисунка, масштабированных для разных контекстов, таких как письменные отчёты и презентации. Система тем также может использоваться для установки палитры цветов по умолчанию. Поскольку цвет особенно важен в визуализации данных, и ни один набор значений по умолчанию не является универсально подходящим, каждая функция построения позволяет легко выбрать альтернативную категориальную палитру или непрерывный градиент, хорошо подходящие для конкретного набора данных и типа графика. Документация seaborn содержит руководство по использованию цвета в визуализации данных, чтобы помочь пользователям принять это важное решение.

seaborn не ставит целью полностью инкапсулировать или заменить matplotlib. Многие полезные

Графики

можно создавать через интерфейс seaborn, но для более продвинутых приложений — таких как определение составных рисунков с несколькими произвольными типами графиков — потребуется также импортировать и использовать matplotlib. Даже при вызове только функций seaborn, более глубокая настройка внешнего вида графика достигается путём указания параметров, которые передаются в базовые функции matplotlib, а корректировка пределов осей, делений и меток по умолчанию выполняется вызовом методов у объекта matplotlib, который возвращают функции seaborn уровня осей. Этот подход отличается от других систем статистической графики, таких как ggplot2 (Wickham, 2016). Хотя seaborn предлагает некоторые похожие возможности и в некоторых случаях использует схожую с ggplot2 терминологию, он не реализует формальную Грамматику графиков (Grammar of Graphics) и не может использоваться для создания произвольных визуализаций. Скорее, его цель — облегчить быстрое исследование и прототипирование с помощью именованных функций и продуманных значений по умолчанию, позволяя пользователю использовать значительную гибкость matplotlib для создания более предметно-специфичной графики и доводки рисунков до публикационного уровня. Пример успешного использования этого подхода для создания воспроизводимых рисунков можно найти по адресу https://github.com/WagnerLabPapers/Waskom_PNAS_2017 (Waskom & Wagner, 2017).

Благодарности

Работа М.Л.В. поддерживалась программой IGERT Национального научного фонда (0801700) и Фондом Саймонса в качестве младшего сотрудника в Simons Society of Fellows (527794). Многие другие помогли улучшить seaborn, задавая вопросы, сообщая об ошибках и внося код; спасибо этому сообществу.

Ссылки